﻿using System.Collections.Generic;

namespace ProblemsSet
{
    public class Problem_90 : BaseProblem
    {
        public override object GetResult()
        {
            var lst = new List<long>() {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
            var rs = new List<List<long>>();

            FormeLists(ref lst, 0, ref rs, new List<long>());

            long res = 0;

            for (var i = 0; i < rs.Count; i++ )
            {
                for (var j = i; j < rs.Count; j++)
                {
                    var ex = true;
                    for (var n = 1; n < 10; n++)
                    {
                        var a1 = (n*n)/10;
                        var a2 = (n * n) % 10;
                        if (rs[i].Contains(a1) && rs[j].Contains(a2) || rs[i].Contains(a2) && rs[j].Contains(a1))
                            continue;
                        ex = false;
                        break;
                    }
                    if (ex)
                        res++;
                }
            }

            return res;
        }

        private static void FormeLists(ref List<long> digits, int index, ref List<List<long>> result, List<long> current)
        {
            if (index >= digits.Count && current.Count < 6) return;
            if (current.Count == 6)
            {
                if (current.Contains(9) && !current.Contains(6)) current.Add(6);
                if (current.Contains(6) && !current.Contains(9)) current.Add(9);
                var eex = false;
                    result.Add(current);
                return;
            }
            for (var i = index; i < digits.Count; i++)
            {
                var tmp = new List<long>(current);
                tmp.Add(digits[i]);
                FormeLists(ref digits, i + 1, ref result, tmp);
            }
        }


        public override string Problem
        {
            get
            {
                return @"Each of the six faces on a cube has a different digit (0 to 9) written on it; the same is done to a second cube. By placing the two cubes side-by-side in different positions we can form a variety of 2-digit numbers.

For example, the square number 64 could be formed:


In fact, by carefully choosing the digits on both cubes it is possible to display all of the square numbers below one-hundred: 01, 04, 09, 16, 25, 36, 49, 64, and 81.

For example, one way this can be achieved is by placing {0, 5, 6, 7, 8, 9} on one cube and {1, 2, 3, 4, 8, 9} on the other cube.

However, for this problem we shall allow the 6 or 9 to be turned upside-down so that an arrangement like {0, 5, 6, 7, 8, 9} and {1, 2, 3, 4, 6, 7} allows for all nine square numbers to be displayed; otherwise it would be impossible to obtain 09.

In determining a distinct arrangement we are interested in the digits on each cube, not the order.

{1, 2, 3, 4, 5, 6} is equivalent to {3, 6, 4, 1, 2, 5}
{1, 2, 3, 4, 5, 6} is distinct from {1, 2, 3, 4, 5, 9}

But because we are allowing 6 and 9 to be reversed, the two distinct sets in the last example both represent the extended set {1, 2, 3, 4, 5, 6, 9} for the purpose of forming 2-digit numbers.

How many distinct arrangements of the two cubes allow for all of the square numbers to be displayed?";
            }
        }

        public override bool IsSolved
        {
            get
            {
                return true;
            }
        }

        public override object Answer
        {
            get
            {
                return 1217;
            }
        }

    }
}
